Enable NX/XD feature for 32-bit PAE Xen.
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Wed, 13 Jul 2005 12:58:41 +0000 (12:58 +0000)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Wed, 13 Jul 2005 12:58:41 +0000 (12:58 +0000)
Signed-off-by: Keir Fraser <keir@xensource.com>
xen/arch/x86/boot/x86_32.S
xen/arch/x86/boot/x86_64.S

index dc1df01e2a9563930c1c6a626bba3f2f17478a1c..fafc707beada4629471143b0d1af90deacdd7c0c 100644 (file)
@@ -2,6 +2,7 @@
 #include <public/xen.h>
 #include <asm/desc.h>
 #include <asm/page.h>
+#include <asm/msr.h>
 
 #define  SECONDARY_CPU_FLAG 0xA5A5A5A5
                 
@@ -57,13 +58,13 @@ __start:
 
         /* Set up FPU. */
         fninit
-        
+
         /* Set up CR4, except global flag which Intel requires should be     */
         /* left until after paging is enabled (IA32 Manual Vol. 3, Sec. 2.5) */
         mov     mmu_cr4_features-__PAGE_OFFSET,%ecx
         and     $0x7f,%cl   # CR4.PGE (global enable)
         mov     %ecx,%cr4
-                
+
         cmp     $(SECONDARY_CPU_FLAG),%ebx
         je      start_paging
                 
@@ -125,6 +126,24 @@ __start:
         loop    1b
 
 start_paging:
+#ifdef CONFIG_X86_PAE
+        /* Enable Execute-Disable (NX/XD) support if it is available. */
+        push    %ebx
+        mov     $0x80000000,%eax
+        cpuid
+        cmp     $0x80000000,%eax    /* Any function > 0x80000000? */
+        jbe     no_execute_disable
+        mov     $0x80000001,%eax
+        cpuid
+        bt      $20,%edx            /* Execute Disable? */
+        jnc     no_execute_disable
+        movl    $MSR_EFER,%ecx
+        rdmsr
+        bts     $_EFER_NX,%eax
+        wrmsr
+no_execute_disable:
+        pop     %ebx
+#endif
         mov     $idle_pg_table-__PAGE_OFFSET,%eax
         mov     %eax,%cr3
         mov     $0x80050033,%eax /* hi-to-lo: PG,AM,WP,NE,ET,MP,PE */
index c5a92e662750de7f98f75a1ca33af0a7b56accca..85c599f5367fb72570ef985ce20c1c270af3c740 100644 (file)
@@ -63,7 +63,7 @@ __start:
         /* Check for Multiboot bootloader */
         cmp     $0x2BADB002,%eax
         jne     not_multiboot
-        
+
         /* Save the Multiboot info structure for later use. */
         mov     %ebx,0x100300       # multiboot_ptr
 
@@ -91,7 +91,7 @@ skip_boot_checks:
         mov     %eax,%cr3
 
         /* Set up EFER (Extended Feature Enable Register). */
-        movl    $MSR_EFER, %ecx
+        movl    $MSR_EFER,%ecx
         rdmsr
         btsl    $_EFER_LME,%eax /* Long Mode      */
         btsl    $_EFER_SCE,%eax /* SYSCALL/SYSRET */